install.packages("useful")
Installing package into 㤼㸱C:/Users/nathd/Documents/R/win-library/4.0㤼㸲
(as 㤼㸱lib㤼㸲 is unspecified)
trying URL 'https://cran.rstudio.com/bin/windows/contrib/4.0/useful_1.2.6.zip'
Content type 'application/zip' length 162666 bytes (158 KB)
downloaded 158 KB
package ‘useful’ successfully unpacked and MD5 sums checked

The downloaded binary packages are in
    C:\Users\nathd\AppData\Local\Temp\RtmpY3R07U\downloaded_packages

Get nflfastR data

pbp_2017 <- nflfastR::load_pbp(seasons = 2017)
pbp_2017 %>% head(15)

Get Big Data Bowl Data

#play by play data (looks like it is just a few weeks of data in the 2017 season)
plays <- vroom("https://raw.githubusercontent.com/nfl-football-ops/Big-Data-Bowl/master/Data/plays.csv")
Rows: 14,193
Columns: 27
Delimiter: ","
chr  [ 8]: possessionTeam, yardlineSide, offenseFormation, personnel.offense, personnel.defense, SpecialTeamsPlayType, PassResult, playDescription
dbl  [16]: gameId, playId, quarter, down, yardsToGo, yardlineNumber, defendersInTheBox, numberOfPassRushers, HomeScoreBeforePlay, VisitorScoreBeforeP...
lgl  [ 2]: isPenalty, isSTPlay
time [ 1]: GameClock

Use `spec()` to retrieve the guessed column specification
Pass a specification to the `col_types` argument to quiet this message
#tracking data for gameid 2017090700 -- may not use this at all
#tracking <- vroom("https://raw.githubusercontent.com/nfl-football-ops/Big-Data-Bowl/master/Data/tracking_gameId_2017090700.csv")

plays %>% head(5)

Clean plays dataframe

#SPLIT PERSONNEL AND ADD TO DATAFRAME

#split string for the defensive personnel
split_def <- stringr::str_split_fixed(plays$personnel.defense, " ", n = 7) %>% 
                          data.frame() %>% 
                          select(X1, X3, X5)
names(split_def) <- c("DL", "LB", "DB")

#split string for the offensive personnel
split_off <- stringr::str_split_fixed(plays$personnel.offense, " ", n = 7) %>% 
                          data.frame() %>% 
                          select(X1, X3, X5)
names(split_off) <- c("RB", "TE", "WR")

#add to plays data and create plays_pers (plays personnel)
plays_pers <- plays %>% cbind(split_def) %>% cbind(split_off)

#view first 20 rows
plays_pers %>% head(20)

Bind Big Data Bowl and nflfastR data

Filter out unwanted plays

Possible Classifications:

Simplify classifications to one variable

Features to use in model:

  • defensive personnel (defendersInTheBox, DL, LB, DB)
  • game situation (quarter, down.x, yardToGo, yardline_100)
  • numberOfPassRushers

Get model data

write.csv(model_data, "Model Data?.csv")
cannot open file 'Model Data?.csv': Invalid argumentError in file(file, ifelse(append, "a", "w")) : 
  cannot open the connection

Run Models

POSSIBLE ADD INS
  • offensive formation
  • yardlineSide
  • rolling epa/play on passes and rushes for offense and defense
  • qbr/defensive rating
  • more in depth game information (time of the clock, etc.)
  • weather
LS0tDQp0aXRsZTogIk5hdGUgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpgYGB7cn0NCiN0byBnZXQgZGF0YQ0KbGlicmFyeShuZmxmYXN0UikNCmxpYnJhcnkoZXNwbnNjcmFwZVIpDQoNCiNvdGhlcg0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KHZyb29tKQ0KbGlicmFyeShyYW5kb21Gb3Jlc3QpDQpsaWJyYXJ5KHVzZWZ1bCkNCmxpYnJhcnkoY2xhc3MpDQpgYGANCg0KDQojIyBHZXQgbmZsZmFzdFIgZGF0YQ0KYGBge3J9DQpwYnBfMjAxNyA8LSBuZmxmYXN0Ujo6bG9hZF9wYnAoc2Vhc29ucyA9IDIwMTcpDQoNCnBicF8yMDE3ICU+JSBoZWFkKDE1KQ0KYGBgDQoNCiMjIEdldCBCaWcgRGF0YSBCb3dsIERhdGENCmBgYHtyfQ0KI3BsYXkgYnkgcGxheSBkYXRhIChsb29rcyBsaWtlIGl0IGlzIGp1c3QgYSBmZXcgd2Vla3Mgb2YgZGF0YSBpbiB0aGUgMjAxNyBzZWFzb24pDQpwbGF5cyA8LSB2cm9vbSgiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL25mbC1mb290YmFsbC1vcHMvQmlnLURhdGEtQm93bC9tYXN0ZXIvRGF0YS9wbGF5cy5jc3YiKQ0KDQojdHJhY2tpbmcgZGF0YSBmb3IgZ2FtZWlkIDIwMTcwOTA3MDAgLS0gbWF5IG5vdCB1c2UgdGhpcyBhdCBhbGwNCiN0cmFja2luZyA8LSB2cm9vbSgiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL25mbC1mb290YmFsbC1vcHMvQmlnLURhdGEtQm93bC9tYXN0ZXIvRGF0YS90cmFja2luZ19nYW1lSWRfMjAxNzA5MDcwMC5jc3YiKQ0KDQpwbGF5cyAlPiUgaGVhZCg1KQ0KYGBgDQoNCg0KIyMjIyBDbGVhbiBwbGF5cyBkYXRhZnJhbWUNCmBgYHtyfQ0KI1NQTElUIFBFUlNPTk5FTCBBTkQgQUREIFRPIERBVEFGUkFNRQ0KDQojc3BsaXQgc3RyaW5nIGZvciB0aGUgZGVmZW5zaXZlIHBlcnNvbm5lbA0Kc3BsaXRfZGVmIDwtIHN0cmluZ3I6OnN0cl9zcGxpdF9maXhlZChwbGF5cyRwZXJzb25uZWwuZGVmZW5zZSwgIiAiLCBuID0gNykgJT4lIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmZyYW1lKCkgJT4lIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QoWDEsIFgzLCBYNSkNCm5hbWVzKHNwbGl0X2RlZikgPC0gYygiREwiLCAiTEIiLCAiREIiKQ0KDQojc3BsaXQgc3RyaW5nIGZvciB0aGUgb2ZmZW5zaXZlIHBlcnNvbm5lbA0Kc3BsaXRfb2ZmIDwtIHN0cmluZ3I6OnN0cl9zcGxpdF9maXhlZChwbGF5cyRwZXJzb25uZWwub2ZmZW5zZSwgIiAiLCBuID0gNykgJT4lIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmZyYW1lKCkgJT4lIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QoWDEsIFgzLCBYNSkNCm5hbWVzKHNwbGl0X29mZikgPC0gYygiUkIiLCAiVEUiLCAiV1IiKQ0KDQojYWRkIHRvIHBsYXlzIGRhdGEgYW5kIGNyZWF0ZSBwbGF5c19wZXJzIChwbGF5cyBwZXJzb25uZWwpDQpwbGF5c19wZXJzIDwtIHBsYXlzICU+JSBjYmluZChzcGxpdF9kZWYpICU+JSBjYmluZChzcGxpdF9vZmYpDQoNCiN2aWV3IGZpcnN0IDIwIHJvd3MNCnBsYXlzX3BlcnMgJT4lIGhlYWQoMjApDQpgYGANCg0KIyMjIyBCaW5kIEJpZyBEYXRhIEJvd2wgYW5kIG5mbGZhc3RSIGRhdGENCmBgYHtyfQ0KI2NsZWFuIHVwIGNvbHVtbiBuYW1lcyBmb3Igam9pbiBjb21wYXRpYmlsaXR5DQpuYW1lcyA8LSBwYnBfMjAxNyAlPiUgbmFtZXMoKQ0KbmFtZXNbMV0gPC0gInBsYXlJZCINCm5hbWVzWzNdIDwtICJnYW1lSWQiDQpuYW1lcyhwYnBfMjAxNykgPC0gbmFtZXMNCnBicF8yMDE3JGdhbWVJZCA8LSBhcy5kb3VibGUocGJwXzIwMTckZ2FtZUlkKQ0KDQojam9pbiBkYXRhIGZyYW1lcw0KcGxheXNfMjAxNyA8LSBpbm5lcl9qb2luKHBsYXlzX3BlcnMsIHBicF8yMDE3LCANCiAgICAgICAgICAgICAgICAgICAgICAgIGJ5ID0gYygiZ2FtZUlkIiwgInBsYXlJZCIpKQ0KYGBgDQoNCg0KIyMjIEZpbHRlciBvdXQgdW53YW50ZWQgcGxheXMNCmBgYHtyfQ0KI2ZpbHRlciBvdXQgc3BlY2lhbCB0ZWFtcyBwbGF5cw0KcGxheXNfMjAxNyA8LSBwbGF5c18yMDE3ICU+JSBmaWx0ZXIoaXMubmEoU3BlY2lhbFRlYW1zUGxheVR5cGUpID09IFRSVUUpDQoNCiNmaWx0ZXIgb3V0IHBlbmFsdGllcw0KcGxheXNfMjAxNyA8LSBwbGF5c18yMDE3ICU+JSBmaWx0ZXIoaXNQZW5hbHR5ID09IEZBTFNFKQ0KYGBgDQoNCiMjIFBvc3NpYmxlIENsYXNzaWZpY2F0aW9uczoNCi0gUGFzcw0KICAtIHNob3J0L2RlZXAgKHBhc3NfbGVuZ3RoKQ0KICAtIGFpcl95YXJkcyAocG9zc2libHkgYmluIHRoaXMgb2ZmIHRvIGdldCBtb3JlIHBvc3NpYmlsaXRpZXMgdGhhbiBhYm92ZSkNCiAgLSBwYXNzX2xvY2F0aW9uDQotIFJ1bg0KICAtIG1pZGRsZS9yaWdodC9sZWZ0IChydW5fbG9jYXRpb24pDQogIC0gcnVuX2dhcCAoY29tYmluZSB3aXRoIGFib3ZlIHZhcmlhYmxlIC0tIG1heWJlIGp1c3QgdXNlIHRoaXMgb25lIHdpdGggbWlkZGxlIGJlY2F1c2UgdGhlIHNpZGUgbWF5IG5vdCByZWFsbHkgbWF0dGVyIGJ1dCB0aGUgZ2FwIGRvZXMpDQoNCg0KIyMjIFNpbXBsaWZ5IGNsYXNzaWZpY2F0aW9ucyB0byBvbmUgdmFyaWFibGUNCmBgYHtyfQ0KI2dldCBwYXNzIGRlc2NyaXB0aW9uIGNsYXNzaWZpY2F0aW9uDQpwbGF5c18yMDE3JHBhc3NfZGVzY3JpcHRpb24gPC0gaWZlbHNlKGlzLm5hKHBsYXlzXzIwMTckcGFzc19sZW5ndGgpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXN0ZSgicGFzcyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5c18yMDE3JHBhc3NfbGVuZ3RoLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheXNfMjAxNyRwYXNzX2xvY2F0aW9uKSkNCiNnZXQgcnVuIGRlc2NyaXB0aW9uIGNsYXNzaWZpY2F0aW9uDQpwbGF5c18yMDE3JHJ1bl9kZXNjcmlwdGlvbiA8LSBpZmVsc2UoaXMubmEocGxheXNfMjAxNyRydW5fbG9jYXRpb24pLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHBsYXlzXzIwMTckcnVuX2xvY2F0aW9uID09ICJtaWRkbGUiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJ1biBtaWRkbGUiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzdGUoInJ1biIsIHBsYXlzXzIwMTckcnVuX2dhcCkpKQ0KDQojY29tYmluZSBkZXNjcmlwdGlvbnMNCnBsYXlzXzIwMTckY2xhc3NpZmljYXRpb24gPC0gcGFzdGUocGxheXNfMjAxNyRwYXNzX2Rlc2NyaXB0aW9uLCBwbGF5c18yMDE3JHJ1bl9kZXNjcmlwdGlvbiwgc2VwID0gIiIpDQoNCiN2aWV3IGRlc2NyaXB0aW9ucyBhbmQgZW5kIGNsYXNzaWZpY2F0aW9uDQpwbGF5c18yMDE3ICU+JSBzZWxlY3QocGFzc19kZXNjcmlwdGlvbiwgcnVuX2Rlc2NyaXB0aW9uLCBjbGFzc2lmaWNhdGlvbikNCmBgYA0KIyMjIEZlYXR1cmVzIHRvIHVzZSBpbiBtb2RlbDoNCi0gZGVmZW5zaXZlIHBlcnNvbm5lbCAoZGVmZW5kZXJzSW5UaGVCb3gsIERMLCBMQiwgREIpDQotIGdhbWUgc2l0dWF0aW9uIChxdWFydGVyLCBkb3duLngsIHlhcmRUb0dvLCB5YXJkbGluZV8xMDApDQotIG51bWJlck9mUGFzc1J1c2hlcnMNCg0KDQojIyBHZXQgbW9kZWwgZGF0YQ0KYGBge3J9DQojZ2V0IG1vZGVsIGRhdGENCm1vZGVsX2RhdGEgPC0gcGxheXNfMjAxNyAlPiUgc2VsZWN0KGNsYXNzaWZpY2F0aW9uLCBkZWZlbmRlcnNJblRoZUJveCwgREwsIExCLCBEQiwgcXVhcnRlciwgZG93bi54LCB5YXJkc1RvR28sIHlhcmRsaW5lXzEwMCkgJT4lDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihjbGFzc2lmaWNhdGlvbiAhPSAiIikNCg0KIyMjIGNsZWFuIGZlYXR1cmVzIGZvciBtb2RlbCBkYXRhDQoNCiNjaGFuZ2UgREwsIExCLCBEQiBpbnRvIG51bWVyaWMgZGF0YSB0eXBlcw0KbW9kZWxfZGF0YSRETCA8LSBhcy5udW1lcmljKG1vZGVsX2RhdGEkREwpDQptb2RlbF9kYXRhJExCIDwtIGFzLm51bWVyaWMobW9kZWxfZGF0YSRMQikNCm1vZGVsX2RhdGEkREIgPC0gYXMubnVtZXJpYyhtb2RlbF9kYXRhJERCKQ0KDQojaW1wdXRlIG1pc3NpbmcgdmFsdWVzIHdpdGggY29sdW1uIG1lZGlhbiAtLSBjb25zaWRlciB0aHJvd2luZyB0aGVzZSByb3dzIG91dA0KbW9kZWxfZGF0YSA8LSB1c2VmdWw6OnNpbXBsZS5pbXB1dGUobW9kZWxfZGF0YSwgZnVuID0gc3RhdHM6Om1lZGlhbikNCg0Kd3JpdGUuY3N2KG1vZGVsX2RhdGEsICJNb2RlbCBEYXRhLmNzdiIpDQoNCiNzaG91bGQgcmV0dXJuIDAgaWYgdGhlcmUgaXMgbm90IG1pc3NpbmcgdmFsdWVzL05BJ3MNCiN3aGljaChpcy5uYShtb2RlbF9kYXRhKSkNCg0KIyMjIFNwbGl0IGludG8gdHJhaW5pbmcgYW5kIHRlc3Rpbmcgc2V0cw0KcmFuZG9tIDwtIHNhbXBsZSgxOm5yb3cobW9kZWxfZGF0YSksIA0KICAgICAgICAgICAgICAgICAuMyAqIG5yb3cobW9kZWxfZGF0YSksIA0KICAgICAgICAgICAgICAgICByZXBsYWNlID0gRkFMU0UpDQoNCnRyYWluIDwtIG1vZGVsX2RhdGFbLXJhbmRvbSwgXQ0KdGVzdCA8LSBtb2RlbF9kYXRhW3JhbmRvbSwgXQ0KdHJhaW5feSA8LSBtb2RlbF9kYXRhWy1yYW5kb20sIDFdDQp0ZXN0X3kgPC0gbW9kZWxfZGF0YVtyYW5kb20sIDFdDQpgYGANCg0KIyMgUnVuIE1vZGVscw0KYGBge3J9DQojUmFuZG9tIEZvcmVzdA0KcmYgPC0gcmFuZG9tRm9yZXN0KGNsYXNzaWZpY2F0aW9uIH4gZGVmZW5kZXJzSW5UaGVCb3ggKyBETCArIExCICsgREIgKyBxdWFydGVyICsgZG93bi54ICsgeWFyZHNUb0dvICsgeWFyZGxpbmVfMTAwLA0KICAgICAgICAgICAgICAgICAgIHByb3hpbWl0eSA9IFRSVUUsDQogICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gdHJhaW4pDQoNCg0KI0tOTg0Ka25uIDwtIGNsYXNzOmtubih0cmFpbiwgdGVzdCwgY2wgPSB0cmFpbl95LCBwcm9iID0gVFJVRSwgayA9IDEwKQ0KDQoNCg0KYGBgDQoNCg0KDQojIyMjIyBQT1NTSUJMRSBBREQgSU5TDQotIG9mZmVuc2l2ZSBmb3JtYXRpb24NCi0geWFyZGxpbmVTaWRlDQotIHJvbGxpbmcgZXBhL3BsYXkgb24gcGFzc2VzIGFuZCBydXNoZXMgZm9yIG9mZmVuc2UgYW5kIGRlZmVuc2UNCi0gcWJyL2RlZmVuc2l2ZSByYXRpbmcNCi0gbW9yZSBpbiBkZXB0aCBnYW1lIGluZm9ybWF0aW9uICh0aW1lIG9mIHRoZSBjbG9jaywgZXRjLikNCi0gd2VhdGhlcg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg==